热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

视频|一步步教你操作websocket通知案例

(文末有福利)websocket通知流程解析我们不能保证用户B和用户A都处于连接状态,但是通常情况下,用户B至少是连接状态,

                             (文末有福利)websocket通知流程 解析
  1. 我们不能保证用户B和用户A都处于连接状态,但是通常情况下,用户B至少是连接状态,用户A不一定跟server保持连接;

  2. 任一用户都不止对应一个客户端。换言之,用户A和用户B都可能打开了多个tab页,对于一个tab页,就会有一个独立的fd标识,我们这里认为任一用户只有最新的fd有效,或者你可以认为用户所有的tab页的连接都有效;

  3. 因为没有用户系统,我们以get传递的参数uid为标识,uid=100视为用户A,uid=101视为用户B;

  4. 我们模拟的tab页包将会包含一个输入内容的文本框、一个输入目标uid的input和一个发送的按钮以满足需求。

操作流程分析:
  1. 用户A($_GET['uid'] = 100)在某个tab页的输入框输入"回复xxx的内容"字样后,点击发送

  2. 用户B($_GET['uid'] = 101)如果处于连接状态,则alert提醒用户B,他的评论被回复了

Server

后端启动:php server.php

class CommentServer
{private $_serv;public $key = '^manks.top&swoole$';// 用户id和fd对应的映射,key => value,key是用户的uid,value是用户的fdpublic $user2fd = [];public function __construct()
{$this->_serv = new swoole_websocket_server("127.0.0.1", 9501);$this->_serv->set(['worker_num' => 1,'heartbeat_check_interval' => 60,'heartbeat_idle_time' => 125,]);$this->_serv->on('open', [$this, 'onOpen']);$this->_serv->on('message', [$this, 'onMessage']);$this->_serv->on('close', [$this, 'onClose']);}/*** @param $serv* @param $request* @return mixed*/public function onOpen($serv, $request)
{// 连接授权$accessResult = $this->checkAccess($serv, $request);if (!$accessResult) {return false;}// 始终把用户最新的fd跟uid映射在一起if (array_key_exists($request->get['uid'], $this->user2fd)) {$existFd = $this->user2fd[$request->get['uid']];$this->close($existFd, 'uid exists.');$this->user2fd[$request->get['uid']] = $request->fd;return false;} else {$this->user2fd[$request->get['uid']] = $request->fd;}}/*** @param $serv* @param $frame* @return mixed*/public function onMessage($serv, $frame)
{// 校验数据的有效性,我们认为数据被`json_decode`处理之后是数组并且数组的`event`项非空才是有效数据// 非有效数据,关闭该连接$data = $frame->data;$data = json_decode($data, true);if (!$data || !is_array($data) || empty($data['event'])) {$this->close($frame->fd, 'data format invalidate.');return false;}// 根据数据的`event`项,判断要做什么,`event`映射到当前类具体的某一个方法,方法不存在则关闭连接$method = $data['event'];if (!method_exists($this, $method)) {$this->close($frame->fd, 'event is not exists.');return false;}$this->$method($frame->fd, $data);}public function onClose($serv, $fd)
{echo "client {$fd} closed.\n";}/*** 校验客户端连接的合法性,无效的连接不允许连接* @param $serv* @param $request* @return mixed*/public function checkAccess($serv, $request)
{// get不存在或者uid和token有一项不存在,关闭当前连接if (!isset($request->get) || !isset($request->get['uid']) || !isset($request->get['token'])) {$this->close($request->fd, 'access faild.');return false;}$uid = $request->get['uid'];$token = $request->get['token'];// 校验token是否正确,无效关闭连接if (md5(md5($uid) . $this->key) != $token) {$this->close($request->fd, 'token invalidate.');return false;}return true;}/*** @param $fd* @param $message* 关闭$fd的连接,并删除该用户的映射*/public function close($fd, $message = '')
{// 关闭连接$this->_serv->close($fd);// 删除映射关系if ($uid = array_search($fd, $this->user2fd)) {unset($this->user2fd[$uid]);}}public function alertTip($fd, $data)
{// 推送目标用户的uid非真或者该uid尚无保存的映射fd,关闭连接if (empty($data['toUid']) || !array_key_exists($data['toUid'], $this->user2fd)) {$this->close($fd);return false;}$this->push($this->user2fd[$data['toUid']], ['event' => $data['event'], 'msg' => '收到一条新的回复.']);}/*** @param $fd* @param $message*/public function push($fd, $message)
{if (!is_array($message)) {$message = [$message];}$message = json_encode($message);// push失败,closeif ($this->_serv->push($fd, $message) == false) {$this->close($fd);}}public function start()
{$this->_serv->start();}
}$server = new CommentServer;
$server->start();
前端页面 client.php

发送内容:
发送给谁:


一步一步教你操作

回复关键字获取资源链接:

wokerman实战之PHP在线客服:wokerman


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
凡惜弟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有